Skip to content

IFBroSharpBrowser接口鼠标键盘操作完整指南

📋 文档概述

本文档详细介绍IFBroSharpBrowser接口中包含的所有鼠标键盘操作方法。这些方法为浏览器自动化提供了完整的用户交互模拟能力,可以实现几乎所有的用户操作场景。

🎯 适用场景

  • UI自动化测试:模拟用户的各种交互操作
  • 数据采集爬虫:自动化表单填写和页面操作
  • 游戏辅助工具:模拟鼠标键盘操作
  • 办公自动化:批量处理Web应用操作

🚀 快速开始

csharp
// 基础使用模式
if (browser != null && browser.IsValid)
{
    // 创建鼠标事件对象
    var mouseEvent = new FBroSharpMouseEvent();
    mouseEvent.X = 100;
    mouseEvent.Y = 200;
    
    // 发送鼠标点击
    browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 1);
    browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 1);
}

🖱️ 鼠标操作方法

1. SendMouseClickEvent - 鼠标点击事件

方法签名

csharp
void SendMouseClickEvent(FBroSharpMouseButtonType ButtonType, FBroSharpMouseEvent mouserEvent, bool mouseUp, int clickCount);

参数说明

参数名类型说明
ButtonTypeFBroSharpMouseButtonType鼠标按钮类型(左键/右键/中键)
mouserEventFBroSharpMouseEvent鼠标事件对象(包含坐标等信息)
mouseUpbooltrue=松开鼠标,false=按下鼠标
clickCountint点击次数(1=单击,2=双击)

鼠标按钮类型枚举

csharp
public enum FBroSharpMouseButtonType
{
    MBT_LEFT,    // 左键
    MBT_MIDDLE,  // 中键(滚轮键)
    MBT_RIGHT    // 右键
}

使用示例

csharp
/// <summary>
/// 执行鼠标左键单击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void ClickLeftButton(int x, int y)
{
    if (browser != null && browser.IsValid)
    {
        // 创建鼠标事件对象
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 模拟鼠标按下
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 1);
        
        // 稍作延迟(可选)
        Thread.Sleep(50);
        
        // 模拟鼠标松开
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 1);
        
        Console.WriteLine($"已在坐标({x}, {y})执行鼠标左键点击");
    }
}

/// <summary>
/// 执行鼠标右键点击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void ClickRightButton(int x, int y)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 右键点击
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_RIGHT, mouseEvent, false, 1);
        Thread.Sleep(50);
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_RIGHT, mouseEvent, true, 1);
        
        Console.WriteLine($"已在坐标({x}, {y})执行鼠标右键点击");
    }
}

/// <summary>
/// 执行鼠标双击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void DoubleClick(int x, int y)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 双击操作
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 2);
        Thread.Sleep(50);
        browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 2);
        
        Console.WriteLine($"已在坐标({x}, {y})执行鼠标双击");
    }
}

2. SendMouseMoveEvent - 鼠标移动事件

方法签名

csharp
void SendMouseMoveEvent(FBroSharpMouseEvent mouserEvent, bool mouseLeave);

参数说明

参数名类型说明
mouserEventFBroSharpMouseEvent鼠标事件对象(包含目标坐标)
mouseLeavebool是否为鼠标离开事件

使用示例

csharp
/// <summary>
/// 移动鼠标到指定位置
/// </summary>
/// <param name="x">目标X坐标</param>
/// <param name="y">目标Y坐标</param>
public void MoveMouse(int x, int y)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 移动鼠标到指定位置
        browser.SendMouseMoveEvent(mouseEvent, false);
        
        Console.WriteLine($"鼠标已移动到坐标({x}, {y})");
    }
}

/// <summary>
/// 模拟鼠标悬停效果
/// </summary>
/// <param name="x">悬停X坐标</param>
/// <param name="y">悬停Y坐标</param>
/// <param name="hoverTime">悬停时间(毫秒)</param>
public void HoverMouse(int x, int y, int hoverTime = 1000)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 移动到目标位置
        browser.SendMouseMoveEvent(mouseEvent, false);
        Console.WriteLine($"鼠标悬停在坐标({x}, {y})");
        
        // 保持悬停
        Thread.Sleep(hoverTime);
        
        // 可选:移开鼠标
        mouseEvent.X = x + 50;
        mouseEvent.Y = y + 50;
        browser.SendMouseMoveEvent(mouseEvent, true);
        Console.WriteLine("鼠标悬停结束");
    }
}

/// <summary>
/// 平滑移动鼠标(模拟真实鼠标移动)
/// </summary>
/// <param name="fromX">起始X坐标</param>
/// <param name="fromY">起始Y坐标</param>
/// <param name="toX">目标X坐标</param>
/// <param name="toY">目标Y坐标</param>
/// <param name="steps">移动步数</param>
public void SmoothMoveMouse(int fromX, int fromY, int toX, int toY, int steps = 10)
{
    if (browser != null && browser.IsValid)
    {
        for (int i = 0; i <= steps; i++)
        {
            int currentX = fromX + (toX - fromX) * i / steps;
            int currentY = fromY + (toY - fromY) * i / steps;
            
            var mouseEvent = new FBroSharpMouseEvent();
            mouseEvent.X = currentX;
            mouseEvent.Y = currentY;
            
            browser.SendMouseMoveEvent(mouseEvent, false);
            Thread.Sleep(20); // 控制移动速度
        }
        
        Console.WriteLine($"鼠标已平滑移动从({fromX}, {fromY})到({toX}, {toY})");
    }
}

3. SendMouseWheelEvent - 鼠标滚轮事件

方法签名

csharp
void SendMouseWheelEvent(FBroSharpMouseEvent mouserEvent, int deltaX, int deltaY);

参数说明

参数名类型说明
mouserEventFBroSharpMouseEvent鼠标事件对象(滚轮位置)
deltaXint水平滚动增量
deltaYint垂直滚动增量

使用示例

csharp
/// <summary>
/// 垂直滚动页面
/// </summary>
/// <param name="x">滚轮位置X坐标</param>
/// <param name="y">滚轮位置Y坐标</param>
/// <param name="scrollAmount">滚动量(正数向上,负数向下)</param>
public void ScrollVertical(int x, int y, int scrollAmount)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 垂直滚动
        browser.SendMouseWheelEvent(mouseEvent, 0, scrollAmount);
        
        string direction = scrollAmount > 0 ? "向上" : "向下";
        Console.WriteLine($"在坐标({x}, {y})执行{direction}滚动,滚动量:{Math.Abs(scrollAmount)}");
    }
}

/// <summary>
/// 水平滚动页面
/// </summary>
/// <param name="x">滚轮位置X坐标</param>
/// <param name="y">滚轮位置Y坐标</param>
/// <param name="scrollAmount">滚动量(正数向右,负数向左)</param>
public void ScrollHorizontal(int x, int y, int scrollAmount)
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = x;
        mouseEvent.Y = y;
        
        // 水平滚动
        browser.SendMouseWheelEvent(mouseEvent, scrollAmount, 0);
        
        string direction = scrollAmount > 0 ? "向右" : "向左";
        Console.WriteLine($"在坐标({x}, {y})执行{direction}滚动,滚动量:{Math.Abs(scrollAmount)}");
    }
}

/// <summary>
/// 滚动到页面顶部
/// </summary>
public void ScrollToTop()
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = 500; // 页面中央
        mouseEvent.Y = 300;
        
        // 大幅度向上滚动
        for (int i = 0; i < 10; i++)
        {
            browser.SendMouseWheelEvent(mouseEvent, 0, 120);
            Thread.Sleep(50);
        }
        
        Console.WriteLine("页面已滚动到顶部");
    }
}

/// <summary>
/// 滚动到页面底部
/// </summary>
public void ScrollToBottom()
{
    if (browser != null && browser.IsValid)
    {
        var mouseEvent = new FBroSharpMouseEvent();
        mouseEvent.X = 500; // 页面中央
        mouseEvent.Y = 300;
        
        // 大幅度向下滚动
        for (int i = 0; i < 10; i++)
        {
            browser.SendMouseWheelEvent(mouseEvent, 0, -120);
            Thread.Sleep(50);
        }
        
        Console.WriteLine("页面已滚动到底部");
    }
}

⌨️ 键盘操作方法

4. SendKeyEvent - 键盘按键事件

方法签名

csharp
void SendKeyEvent(FBroSharpKeyEvent keyevent);

参数说明

参数名类型说明
keyeventFBroSharpKeyEvent键盘事件对象

FBroSharpKeyEvent 对象属性

csharp
public class FBroSharpKeyEvent
{
    public int WindowsKeyCode { get; set; }     // Windows键码
    public int NativeKeyCode { get; set; }      // 原生键码
    public bool IsSystemKey { get; set; }       // 是否为系统键
    public int Modifiers { get; set; }          // 修饰键(Ctrl、Alt、Shift等)
    public char Character { get; set; }         // 字符
    public FBroSharpKeyEventType Type { get; set; } // 事件类型
}

键盘事件类型

csharp
public enum FBroSharpKeyEventType
{
    KEYEVENT_RAWKEYDOWN,  // 按键按下(原始事件)
    KEYEVENT_KEYDOWN,     // 按键按下
    KEYEVENT_KEYUP,       // 按键松开
    KEYEVENT_CHAR         // 字符输入
}

使用示例

csharp
/// <summary>
/// 发送单个字符
/// </summary>
/// <param name="character">要发送的字符</param>
public void SendCharacter(char character)
{
    if (browser != null && browser.IsValid)
    {
        var keyEvent = new FBroSharpKeyEvent();
        keyEvent.Type = FBroSharpKeyEventType.KEYEVENT_CHAR;
        keyEvent.Character = character;
        keyEvent.WindowsKeyCode = (int)character;
        
        browser.SendKeyEvent(keyEvent);
        Console.WriteLine($"已发送字符: {character}");
    }
}

/// <summary>
/// 发送文本字符串
/// </summary>
/// <param name="text">要发送的文本</param>
public void SendText(string text)
{
    if (browser != null && browser.IsValid)
    {
        foreach (char c in text)
        {
            SendCharacter(c);
            Thread.Sleep(50); // 模拟真实输入速度
        }
        Console.WriteLine($"已发送文本: {text}");
    }
}

/// <summary>
/// 发送按键(按下和松开)
/// </summary>
/// <param name="keyCode">按键码</param>
public void SendKey(int keyCode)
{
    if (browser != null && browser.IsValid)
    {
        // 按键按下
        var keyDownEvent = new FBroSharpKeyEvent();
        keyDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
        keyDownEvent.WindowsKeyCode = keyCode;
        browser.SendKeyEvent(keyDownEvent);
        
        Thread.Sleep(50);
        
        // 按键松开
        var keyUpEvent = new FBroSharpKeyEvent();
        keyUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
        keyUpEvent.WindowsKeyCode = keyCode;
        browser.SendKeyEvent(keyUpEvent);
        
        Console.WriteLine($"已发送按键,键码: {keyCode}");
    }
}

/// <summary>
/// 发送Enter键
/// </summary>
public void SendEnter()
{
    SendKey(13); // Enter键的键码
    Console.WriteLine("已发送Enter键");
}

/// <summary>
/// 发送Tab键
/// </summary>
public void SendTab()
{
    SendKey(9); // Tab键的键码
    Console.WriteLine("已发送Tab键");
}

/// <summary>
/// 发送Backspace键
/// </summary>
public void SendBackspace()
{
    SendKey(8); // Backspace键的键码
    Console.WriteLine("已发送Backspace键");
}

/// <summary>
/// 发送组合键(如Ctrl+A)
/// </summary>
/// <param name="modifier">修饰键</param>
/// <param name="key">主键</param>
public void SendCombinationKey(int modifier, int key)
{
    if (browser != null && browser.IsValid)
    {
        // 按下修饰键
        var modifierDownEvent = new FBroSharpKeyEvent();
        modifierDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
        modifierDownEvent.WindowsKeyCode = modifier;
        modifierDownEvent.Modifiers = GetModifierFlag(modifier);
        browser.SendKeyEvent(modifierDownEvent);
        
        Thread.Sleep(50);
        
        // 按下主键
        var keyDownEvent = new FBroSharpKeyEvent();
        keyDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
        keyDownEvent.WindowsKeyCode = key;
        keyDownEvent.Modifiers = GetModifierFlag(modifier);
        browser.SendKeyEvent(keyDownEvent);
        
        Thread.Sleep(50);
        
        // 松开主键
        var keyUpEvent = new FBroSharpKeyEvent();
        keyUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
        keyUpEvent.WindowsKeyCode = key;
        keyUpEvent.Modifiers = GetModifierFlag(modifier);
        browser.SendKeyEvent(keyUpEvent);
        
        Thread.Sleep(50);
        
        // 松开修饰键
        var modifierUpEvent = new FBroSharpKeyEvent();
        modifierUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
        modifierUpEvent.WindowsKeyCode = modifier;
        browser.SendKeyEvent(modifierUpEvent);
        
        Console.WriteLine($"已发送组合键,修饰键: {modifier}, 主键: {key}");
    }
}

/// <summary>
/// 获取修饰键标志
/// </summary>
/// <param name="keyCode">修饰键键码</param>
/// <returns>修饰键标志</returns>
private int GetModifierFlag(int keyCode)
{
    switch (keyCode)
    {
        case 17: return 0x04; // Ctrl
        case 18: return 0x08; // Alt  
        case 16: return 0x02; // Shift
        default: return 0x00;
    }
}

/// <summary>
/// 全选文本(Ctrl+A)
/// </summary>
public void SelectAll()
{
    SendCombinationKey(17, 65); // Ctrl + A
    Console.WriteLine("已执行全选操作");
}

/// <summary>
/// 复制文本(Ctrl+C)
/// </summary>
public void Copy()
{
    SendCombinationKey(17, 67); // Ctrl + C
    Console.WriteLine("已执行复制操作");
}

/// <summary>
/// 粘贴文本(Ctrl+V)
/// </summary>
public void Paste()
{
    SendCombinationKey(17, 86); // Ctrl + V
    Console.WriteLine("已执行粘贴操作");
}

5. SendFocusEvent - 焦点事件

方法签名

csharp
void SendFocusEvent(bool setFocus);

参数说明

参数名类型说明
setFocusbooltrue=设置焦点,false=失去焦点

使用示例

csharp
/// <summary>
/// 设置浏览器焦点
/// </summary>
public void SetBrowserFocus()
{
    if (browser != null && browser.IsValid)
    {
        browser.SendFocusEvent(true);
        Console.WriteLine("浏览器已获得焦点");
    }
}

/// <summary>
/// 取消浏览器焦点
/// </summary>
public void RemoveBrowserFocus()
{
    if (browser != null && browser.IsValid)
    {
        browser.SendFocusEvent(false);
        Console.WriteLine("浏览器已失去焦点");
    }
}

/// <summary>
/// 为输入操作准备焦点
/// </summary>
/// <param name="x">输入框X坐标</param>
/// <param name="y">输入框Y坐标</param>
/// <param name="text">要输入的文本</param>
public void FocusAndInput(int x, int y, string text)
{
    if (browser != null && browser.IsValid)
    {
        // 1. 点击输入框获得焦点
        ClickLeftButton(x, y);
        Thread.Sleep(200);
        
        // 2. 确保浏览器有焦点
        SetBrowserFocus();
        Thread.Sleep(100);
        
        // 3. 清空现有内容(Ctrl+A + Delete)
        SelectAll();
        Thread.Sleep(100);
        SendKey(46); // Delete键
        Thread.Sleep(100);
        
        // 4. 输入新文本
        SendText(text);
        
        Console.WriteLine($"已在坐标({x}, {y})输入文本: {text}");
    }
}

6. SendTouchEvent - 触摸事件

方法签名

csharp
void SendTouchEvent(FBroSharpTouchEvent touchEvent);

参数说明

参数名类型说明
touchEventFBroSharpTouchEvent触摸事件对象

使用示例

csharp
/// <summary>
/// 发送触摸点击事件
/// </summary>
/// <param name="x">触摸X坐标</param>
/// <param name="y">触摸Y坐标</param>
public void SendTouchClick(int x, int y)
{
    if (browser != null && browser.IsValid)
    {
        var touchEvent = new FBroSharpTouchEvent();
        // 配置触摸事件参数
        // 注:具体参数配置需要参考FBroSharpTouchEvent的定义
        
        browser.SendTouchEvent(touchEvent);
        Console.WriteLine($"已在坐标({x}, {y})发送触摸点击事件");
    }
}

🔧 综合使用示例

表单自动填写示例

csharp
/// <summary>
/// 自动填写登录表单
/// </summary>
/// <param name="usernameX">用户名输入框X坐标</param>
/// <param name="usernameY">用户名输入框Y坐标</param>
/// <param name="passwordX">密码输入框X坐标</param>
/// <param name="passwordY">密码输入框Y坐标</param>
/// <param name="loginButtonX">登录按钮X坐标</param>
/// <param name="loginButtonY">登录按钮Y坐标</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public void AutoLogin(int usernameX, int usernameY, int passwordX, int passwordY, 
                     int loginButtonX, int loginButtonY, string username, string password)
{
    if (browser != null && browser.IsValid)
    {
        try
        {
            Console.WriteLine("开始自动登录...");
            
            // 1. 填写用户名
            Console.WriteLine("填写用户名...");
            FocusAndInput(usernameX, usernameY, username);
            Thread.Sleep(500);
            
            // 2. 填写密码
            Console.WriteLine("填写密码...");
            FocusAndInput(passwordX, passwordY, password);
            Thread.Sleep(500);
            
            // 3. 点击登录按钮
            Console.WriteLine("点击登录按钮...");
            ClickLeftButton(loginButtonX, loginButtonY);
            
            Console.WriteLine("自动登录完成");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"自动登录失败: {ex.Message}");
        }
    }
}

页面操作示例

csharp
/// <summary>
/// 综合页面操作示例
/// </summary>
public void ComprehensivePageOperation()
{
    if (browser != null && browser.IsValid)
    {
        Console.WriteLine("开始执行综合页面操作...");
        
        // 1. 滚动到页面顶部
        ScrollToTop();
        Thread.Sleep(1000);
        
        // 2. 平滑移动鼠标到页面中央
        SmoothMoveMouse(0, 0, 500, 300, 20);
        Thread.Sleep(500);
        
        // 3. 模拟鼠标悬停
        HoverMouse(500, 300, 2000);
        Thread.Sleep(500);
        
        // 4. 向下滚动一些
        ScrollVertical(500, 300, -300);
        Thread.Sleep(1000);
        
        // 5. 右键点击
        ClickRightButton(500, 300);
        Thread.Sleep(1000);
        
        // 6. 按ESC键关闭右键菜单
        SendKey(27); // ESC键
        Thread.Sleep(500);
        
        // 7. 使用键盘快捷键刷新页面
        SendCombinationKey(17, 82); // Ctrl + R
        
        Console.WriteLine("综合页面操作完成");
    }
}

⚠️ 重要注意事项

1. 线程安全

  • 所有UI相关操作必须在UI线程中执行
  • 避免在多个线程中同时操作同一个浏览器实例

2. 坐标系统

  • 坐标相对于浏览器视图的左上角
  • 确保坐标在浏览器可视区域内

3. 时间控制

  • 操作之间适当添加延迟,模拟真实用户行为
  • 过快的操作可能导致页面响应不及时

4. 错误处理

csharp
/// <summary>
/// 安全的鼠标点击操作
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
/// <returns>操作是否成功</returns>
public bool SafeClick(int x, int y)
{
    try
    {
        if (browser == null || !browser.IsValid)
        {
            Console.WriteLine("浏览器实例无效");
            return false;
        }
        
        ClickLeftButton(x, y);
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"点击操作失败: {ex.Message}");
        return false;
    }
}

5. 资源管理

  • 长时间操作后,注意释放相关资源
  • 监控内存使用情况,避免内存泄漏

6. 调试技巧

csharp
/// <summary>
/// 启用调试模式的操作记录
/// </summary>
public bool DebugMode { get; set; } = false;

private void LogOperation(string operation)
{
    if (DebugMode)
    {
        Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] {operation}");
    }
}

📖 相关文档


🎯 总结

IFBroSharpBrowser接口提供了完整的用户交互模拟能力,通过合理使用这些方法,可以实现复杂的浏览器自动化操作。在实际使用中,建议:

  1. 逐步构建:从简单的单个操作开始,逐步组合成复杂的操作序列
  2. 充分测试:在不同的页面和环境中测试操作的稳定性
  3. 错误处理:为所有操作添加适当的错误处理和重试机制
  4. 性能优化:避免不必要的延迟,提高操作效率
  5. 用户体验:模拟真实用户行为,避免过于机械化的操作模式

如果文档对您有帮助,欢迎 请喝咖啡 ☕ | 软件发布 | 源码购买